package pe.edu.upc.karaoke.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import pe.edu.upc.karaoke.excepcion.DAOExcepcion;
import pe.edu.upc.karaoke.modelo.*;
import pe.edu.upc.karaoke.util.ConexionBD;


public class ComprobanteDAO extends BaseDAO {
		
			
	public Comprobante insertar(Comprobante comprobante) throws DAOExcepcion {
		
		java.util.Date d; //para trabajar con fecha y hora
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {
				String query =	"INSERT INTO COMPROBANTE (FECHA, MONTO, IDCAJERO) " +
								"VALUES (?,?,?)";
				
				con = ConexionBD.obtenerConexion();
				con.setAutoCommit(false);
				stmt = con.prepareStatement(query);
				
				d = comprobante.getFecha();
				java.sql.Timestamp dt = new java.sql.Timestamp(d.getTime());
				
				stmt.setTimestamp(1, dt);
				stmt.setDouble(2, comprobante.getMonto());
				stmt.setInt(3, comprobante.getCajero().getIdCajero());
				
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("ERROR: NO SE PUDO INSERTAR");
				}
	
				int id = 0;
				query = "SELECT LAST_INSERT_ID()";
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				if (rs.next()) {
					id = rs.getInt(1);
				}
				comprobante.setIdComrpobante(id);
				
				for (ComprobanteDetalle comprobanteDetalle : comprobante.getDetalles()) {
						
						query =	"INSERT INTO DETALLECOMPROBANTE (IDCOMPROBANTE, IDPRODUCTO, CANTIDAD) " +
								"VALUES (?,?,?)";
					
						stmt = con.prepareStatement(query);
						stmt.setInt(1, id);
						stmt.setInt(2, comprobanteDetalle.getProducto().getIdProducto());
						stmt.setInt(3, comprobanteDetalle.getCantidad());
						
	                    
						int u = stmt.executeUpdate();
						if (u != 1) {
							throw new SQLException("ERROR: NO SE PUDO INSERTAR");
						}
			
						int idd = 0;
						query = "SELECT LAST_INSERT_ID()";
						stmt = con.prepareStatement(query);
						rs = stmt.executeQuery();
						if (rs.next()) {
							idd = rs.getInt(1);
						}
						
	                    comprobanteDetalle.setIdComprobante(idd);
	            }
	            con.commit();

		} catch (SQLException e) {
			try {
	                con.rollback();
	        } catch (SQLException e1) {
	                throw new DAOExcepcion(e.getMessage());
	        }
			comprobante = null;
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());

		} finally {
			try {
	                con.setAutoCommit(true);
	        } catch (SQLException e) {
	                throw new DAOExcepcion(e.getMessage());
	        }
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		
		}
		return comprobante;
	}

	public List<Comprobante> listarComprobante() throws DAOExcepcion {
		
		String query =	"SELECT C.IDCOMPROBANTE, C.FECHA, C.MONTO FROM COMPROBANTE C ";
		List<Comprobante> lista = new ArrayList<Comprobante>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try {

				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				rs = stmt.executeQuery();
				
				while (rs.next()) {
					Comprobante comprobante = new Comprobante();
					comprobante.setIdComrpobante(rs.getInt("IDCOMPROBANTE"));
					comprobante.setFecha(rs.getDate("FECHA"));
					comprobante.setMonto(rs.getDouble("MONTO"));
					
					lista.add(comprobante);
				}
		} 
		catch (SQLException e) {
				lista = null;
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
		} 
		finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
		}
		return lista;
	}


}
		